package com.zq.solution.listnode;

/**
 * @ClassName SwapPairs
 * @Description 两两交换链表中的节点
 * 定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 * 你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 * 示例：给定 1->2->3->4, 你应该返回 2->1->4->3.
 * @Author ZQ
 * @Date 2020/10/13 9:26
 * @Version 1.0
 */
public class SwapPairs {

    public ListNode<Integer> swapPairs1(ListNode<Integer> head) {//递归
        if (head == null || head.next == null) return head;
        ListNode<Integer> newHead = head.next;
        head.next = swapPairs1(newHead.next);
        newHead.next = head;

        return newHead;
    }

    public ListNode<Integer> swapPairs2(ListNode<Integer> head) {//迭代
        ListNode<Integer> dummyHead = new ListNode<Integer>(0);
        dummyHead.next = head;
        ListNode<Integer> temp = dummyHead;
        while (temp.next != null && temp.next.next != null) {
            ListNode<Integer> node1 = temp.next;
            ListNode<Integer> node2 = temp.next.next;
            temp.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            temp = node1;
        }
        return dummyHead.next;
    }
}
